
import _Banque.*;
import _Tests.Tests;

public class TI_Banque_N1
{
	public static void main(String[] args) throws Exception
	{
		Tests.Begin("Integration du package _Banque", "1.0.0");
		
		Tests.Design("Controle de 3 titulaires, dans une meme agence, dans une meme banque", 3);
		{
			// --- creation de la banque
			Banque banque = new Banque("BNP", "18652", "Patate", "15498625635478");

			// --- ouverture de l'agence
			banque.creerRegion("PACA");
			banque.ouvrirAgence("PACA", "pegomas");
			AgenceBancaire aPegomas = banque.getAgence(1001);
			
			// --- creation des titulaires
			Titulaire bob =  new Titulaire("Bob", "Eponge", "1999/05/15", "Bikini Bottom");
			Titulaire edouard= new Titulaire("Oger", "Edouard", "2005/12/30", "Infini");
			Titulaire valentin= new Titulaire("Pruliere", "Valentin", "2004/12/17", "Et");

			
			Tests.Case("Cas initial (aucun compte ouvert)");
			{
				Tests.Unit(0, aPegomas.getNombreComptes());
				Tests.Unit(0, banque.nombreComptes('C'));
				Tests.Unit(0, banque.nombreComptes('E'));
				Tests.Unit(0, aPegomas.nombreClients());
				Tests.Unit(0, banque.nombreClients("PACA"));
			}
			
			Tests.Case("Cas de l'ouverture de plusieurs comptes");
			{
				aPegomas.ouvrirCompte(bob);
				aPegomas.ouvrirCompte(edouard, 0.05f);
				aPegomas.ouvrirCompte(valentin);
				
				Tests.Unit(3, aPegomas.getNombreComptes());
				Tests.Unit(2, banque.nombreComptes('C'));
				Tests.Unit(1, banque.nombreComptes('E'));

			}
			
			Tests.Case("Cas de quelques operations sur les comptes");
			{
				CompteCourant ccBob = (CompteCourant) aPegomas.compteBancaire(8000001);
				CompteCourant ccVal = (CompteCourant) aPegomas.compteBancaire(8000002);
				CompteEpargne ceEd = (CompteEpargne) aPegomas.compteBancaire(4000001);
				
				ccBob.executer("Versement n°1", 'V', 15000.f);
				ceEd.executer("Versement n°1", 'V', 500.f);
				ccVal.executer("Versement n°1", 'V', 10.f);
				
				Tests.Unit(15510.f, banque.totalDepots());
				Tests.Unit(3, banque.nombreOperations(_Banque.dateCourante()));
				
				ccBob.executer("Retrait n°1", 'R', 1000.f);
				ceEd.executer("Retrait n°1", 'R', 9.92063492f);
				
				Tests.Unit(14500.f, banque.totalDepots());
				Tests.Unit(5, banque.nombreOperations(_Banque.dateCourante()));
				Tests.Unit(14000.f, ccBob.getSoldeCompte());
				Tests.Unit(2, ceEd.getNombreOperations());
				Tests.Unit(1, ccVal.getNombreOperations());
			}
			
			Tests.Case("Cas de la cloture de 2 comptes");
			{
				CompteCourant ccBob = (CompteCourant) aPegomas.compteBancaire(8000001);
				CompteCourant ccVal = (CompteCourant) aPegomas.compteBancaire(8000002);
				CompteEpargne ceEd = (CompteEpargne) aPegomas.compteBancaire(4000001);
				
				Tests.Unit(14000.f, ccBob.cloturer());
				Tests.Unit(500.f, banque.totalDepots());
				Tests.Unit(10.f, ccVal.cloturer());
				Tests.Unit(490.f, banque.totalDepots());
				// --- le total depot de la banque == le solde du seul compte non fermé
				Tests.Unit(ceEd.getSoldeCompte(), banque.totalDepots());
			}
	
		}

		Tests.End();
	}
}
